#include "macd.h"

#include <iostream>
#include <stdexcept>
#include <iomanip>

Macd::Macd(int fastPeriod, int slowPeriod, int signalPeriod): ema12(fastPeriod), ema26(slowPeriod), dea(signalPeriod) {}
// 重置MACD计算器状态
void Macd::reset() {
    ema12.reset();
    ema26.reset();
    dea.reset();
}
std::vector<Macd::MACDResult> Macd::calculateBatch(const std::vector<double>& prices) {
    if (prices.size() < 26) {  // 至少需要26个数据点才能计算完整MACD
        throw std::invalid_argument("价格数据点数量不足，至少需要26个数据");
    }

    reset();
    std::vector<MACDResult> results;
    results.reserve(prices.size());

    // 计算EMA12和EMA26
    std::vector<double> ema12Values = ema12.calculateBatch(prices);
    std::vector<double> ema26Values = ema26.calculateBatch(prices);

    // 计算DIF、DEA和BAR
    for (size_t i = 0; i < prices.size(); ++i) {
        MACDResult result;
        result.dif = ema12Values[i] - ema26Values[i];

        // 计算DEA（DIF的EMA）
        if (i == 0) {
            dea.reset();  // 重置DEA计算器
            result.dea = dea.calculate(result.dif);
        } else {
            result.dea = dea.calculate(result.dif);
        }

        result.bar = (result.dif - result.dea) * 2;
        results.push_back(result);
    }

    return results;
}
// 示例用法
int testMacdMain() {
    try {
        // 创建MACD计算器（使用默认参数12,26,9）
        Macd macdCalc;

        // 示例价格数据（至少26个数据点）
        std::vector<double> prices = {
            22.27, 22.19, 22.08, 22.17, 22.18, 22.13, 22.23, 22.43,
            22.24, 22.29, 22.15, 22.39, 22.38, 22.61, 23.36, 24.05,
            23.75, 23.83, 23.95, 23.89, 24.00, 24.10, 24.30, 24.25,
            24.31, 24.50, 24.45, 24.60, 24.75, 24.80
        };

        // 计算MACD
        std::vector<Macd::MACDResult> macdResults = macdCalc.calculateBatch(prices);

        // 输出结果（只展示从第26个数据点开始的完整结果）
        std::cout << "MACD指标计算结果（从第26个数据点开始）：\n";
        std::cout << std::left
                  << std::setw(8) << "价格"
                  << std::setw(10) << "DIF"
                  << std::setw(10) << "DEA"
                  << std::setw(10) << "BAR"
                  << std::endl;
        std::cout << std::string(38, '-') << std::endl;

        for (size_t i = 25; i < prices.size(); ++i) {  // 从第26个数据点开始（索引25）
            std::cout << std::left
                      << std::setw(8) << std::fixed << std::setprecision(2) << prices[i]
                      << std::setw(10) << std::fixed << std::setprecision(4) << macdResults[i].dif
                      << std::setw(10) << std::fixed << std::setprecision(4) << macdResults[i].dea
                      << std::setw(10) << std::fixed << std::setprecision(4) << macdResults[i].bar
                      << std::endl;
        }

    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}
